﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using PlanProd.Contracts.enums;
using PlanProd.Contracts;
using WebAppPlanProduccion.Code.InnerClasses;

namespace WebAppPlanProduccion.Code
{
    public static class MiscHelper
    {
        public static List<Desvio> CargarDesvios(string userName, TipoDesvio tipoDesvio, int causaDesvioId, PlanProduccion planProduccion, List<DesvioProductoSemana> DesvioProductoSemanaList)
        {
            List<Desvio> desvios = new List<Desvio>();

            // Para cada producto, Cargo los desvios con sus detalles
            var prodIds = DesvioProductoSemanaList.Select(dps => dps.ProductoId).Distinct();
            foreach (var idProd in prodIds)
            {
                desvios.Add(CargarDesvio(userName, tipoDesvio, causaDesvioId, planProduccion, idProd, DesvioProductoSemanaList));
            }

            return desvios;
        }

        private static Desvio CargarDesvio(string userName, TipoDesvio tipoDesvio, int causaDesvioId, PlanProduccion planProduccion, int idProd, List<DesvioProductoSemana> DesvioProductoSemanaList)
        {
            Desvio desvio = new Desvio();
            desvio.TipoDesvio = tipoDesvio;
            desvio.CausaDesvioId = causaDesvioId;
            desvio.UsuarioCreador = userName;
            desvio.PlanProduccionId = planProduccion.Id;

            var DetalleProd = planProduccion.DetalleDeProductos.Where(dp => dp.ProductoId == idProd).Single();
            desvio.PlanProduccionDetallePrimeraId = DetalleProd.Id;

            // Filto solo los cambios al mismo producto
            List<DesvioProductoSemana> DetallesDesvioSemanaCantidadList = DesvioProductoSemanaList.Where(dps => dps.ProductoId == idProd).ToList();

            foreach (DesvioProductoSemana productoSemana in DetallesDesvioSemanaCantidadList)
            {
                var DetalleProdCantidad = DetalleProd.CantidadesPorSemana.Where(c => c.NumeroSemana == productoSemana.NumeroSemanaDesde).Single();

                DesvioDetalle desvioDetalle = new DesvioDetalle();
                desvioDetalle.DetalleProductoCantidadId = DetalleProdCantidad.Id;
                desvioDetalle.NumeroSemana = productoSemana.NumeroSemanaDesde;
                desvioDetalle.CantidadInicial = DetalleProdCantidad.Cantidad;

                if (productoSemana.NumeroSemanaHasta.HasValue)
                {
                    // Es un movimiento, entonces se agrega un detalle mas para el destino del movimiento
                    var DetalleProdCantidadDestino = DetalleProd.CantidadesPorSemana.Where(c => c.NumeroSemana == productoSemana.NumeroSemanaHasta.Value).Single();
                    DesvioDetalle desvioDetalleDestino = new DesvioDetalle();
                    desvioDetalleDestino.DetalleProductoCantidadId = DetalleProdCantidadDestino.Id;
                    desvioDetalleDestino.NumeroSemana = productoSemana.NumeroSemanaHasta.Value;
                    desvioDetalleDestino.CantidadInicial = DetalleProdCantidadDestino.Cantidad;
                    desvioDetalleDestino.CantidadFinal = desvioDetalleDestino.CantidadInicial + productoSemana.Cantidad;
                    desvio.DesvioDetalles.Add(desvioDetalleDestino);

                    desvioDetalle.CantidadFinal = desvioDetalle.CantidadInicial - productoSemana.Cantidad;
                }
                else
                {
                    desvioDetalle.CantidadFinal = desvioDetalle.CantidadInicial + productoSemana.Cantidad;
                }

                desvio.DesvioDetalles.Add(desvioDetalle);
            }

            return desvio;
        }             
    }
}